/*
 * GbtMediaDevice.h
 *
 *  Created on: 2018年5月16日
 *      Author: zhengboyuan
 */

#ifndef GBTMEDIADEVICE_H_
#define GBTMEDIADEVICE_H_

#include "GbtDeviceType.h"


namespace gbt
{

class GbtMediaDevice;


class GbtMediaDeviceTalkHandler
{
public:
    virtual ~GbtMediaDeviceTalkHandler() {}

	/**
	 * 对讲开始
	 * @param format	音频流格式
	 */
    virtual void onTalkBegin(const GBT_AutioFormat& format) =0;

    /**
     * 对讲流
     * @param pkt	音频包
     */
    virtual void onTalking(MPacket& pkt) =0;

    /**
     * 对讲结束
     */
    virtual void onTalkEnd() =0;

};

/**
 * 媒体设备监听器
 */
class GbtMediaDeviceSink
{
public:
    virtual ~GbtMediaDeviceSink() {}

    /**
     * 开始会话
     * @param device
     * @param peerID    对方ID
     */
    virtual void onBeginPlay(GbtMediaDevice* device, const char* fromUri) =0;

    /**
     * 结束会话
     * @param device
     * @param peerID    对方ID
     */
    virtual void onEndPlay(GbtMediaDevice* device, const char* fromUri) =0;


};


/**
 * 媒体设备.
 * 表示音视频媒体流,对讲
 */
class GbtMediaDevice
{
public:
    virtual ~GbtMediaDevice() {}

    /**
     * 获取标识
     * @return
     */
    virtual int getID() const =0;

    /**
     * 获取设备标识, 即统一编码
     * @return
     */
    virtual const char* getDeviceID() const =0;

    /**
     * 设置设备信息.
     * @param info
     */
    virtual void setDeviceInfo(const GBT_DeviceInfo& info) =0;

    /**
     * 设置GPS位置, 可多次调用进行更新.
     * @param position
     */
    virtual void setPosition(const GBT_Position& position) =0;


    /**
     * 打开设备
     * @param catalog   设备目录
     * @param talkDeviceID    对讲设备ID, 为NULL或者空表示不支持对讲
     * @return
     */
    virtual int open(const GBT_Catalog& catalog, const char* talkDeviceID) =0;

    virtual void close() =0;

    virtual bool isOpen() =0;


    /**
     * 设置媒体格式. 对于音频, 如果是AAC, fmt.audioProfile 必须设置.
     * @param fmt
     */
    virtual void setFormat(const MFormat& fmt) =0;

    /**
     * 发送媒体包. 即时没有被点播, 也可以调用.
     * @param pkt
     * @return
     */
    virtual bool writePacket(const MPacket& pkt) =0;

    /**
     * 设置对讲媒体格式.
     * 默认是 PCMA 单声道 8000Hz.
     * @param codec     音频编码
     * @param channels  通道数
     * @param freq      采样率
     */
    virtual bool setTalkFormat(int codec, int channels, int freq) =0;

    /**
     * 设置对讲处理器
     * @param handler
     */
    virtual void setTalkHandler(GbtMediaDeviceTalkHandler* handler) =0;

    /**
     * 设置上下线状态
     * @param isOnline true 表示上线
     */
    virtual void setStatus(bool isOnline) =0;

    /**
     * 设置监听器
     * @param sink
     */
    virtual void setSink(GbtMediaDeviceSink* sink) =0;


    virtual const GBT_DeviceInfo& getDeviceInfo() =0;

    virtual GBT_Position getPosition() =0;

    virtual bool isTalkEnabled() =0;

    virtual bool isOnline() =0;

    virtual const char* getTalkDeviceID() =0;

    /**
    * 设置名称
    * @param name   设备名称
    * @return 
    */
    virtual void setName(const char* name) = 0;


};


} /* namespace gbt */

#endif /* GBTMEDIADEVICE_H_ */
